package com.hex.ds.hdrs.period.task.controller;


import com.hex.bigdata.hbda.annotation.Log;
import com.hex.bigdata.hbda.base.Page;
import com.hex.ds.hdrs.common.page.PageData;
import com.hex.ds.hdrs.period.job.vo.query.PeriodJobQueryVo;
import com.hex.ds.hdrs.period.task.converter.IPeriodTaskVoConverter;
import com.hex.ds.hdrs.period.task.dto.PeriodTaskDto;
import com.hex.ds.hdrs.period.task.po.PeriodTask;
import com.hex.ds.hdrs.period.task.service.PeriodTaskService;
import com.hex.ds.hdrs.period.task.vo.PeriodTaskVo;
import com.hex.ds.hdrs.period.task.vo.query.PeriodTaskQueryVo;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 周期任务实例表 前端控制器
 * </p>
 *
 * @author ${author}
 * @since 2020-11-26
 */
@Slf4j
@RestController
@RequestMapping("/api/periodTask")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PeriodTaskController {

    private final PeriodTaskService periodTaskService;

    private final IPeriodTaskVoConverter converter;

    /*
     * @Method: queryListByPage <br>
     * @Param: [periodTaskQueryVo, page] <br>
     * @Return: org.springframework.http.ResponseEntity<?> <br>
     * @Description：分页查询<br>
     * @Author： wz.li<br>
     * @Date： 2023/5/4 16:04 <br>
     * @Version： V2.0.2<br>
     */
    @GetMapping
    @ApiOperation("分页查询")
    public ResponseEntity<?> queryListByPage(PeriodTaskQueryVo periodTaskQueryVo, Page page) {
        log.info("【PeriodTaskController.queryListByPage】periodJob: {}", periodTaskQueryVo);
        return ResponseEntity.ok(periodTaskService.queryListByPage(converter.toPeriodTaskDto(periodTaskQueryVo), page));
    }

    @Log("获取某个作业的实例")
    @ApiOperation("获取某个作业的实例")
    @PostMapping(value = "/getTaskList")
    public ResponseEntity<?> getTaskList(@RequestBody PeriodTaskQueryVo periodTaskQueryVo) {
        log.debug("【PeriodTaskController.getTaskList】periodTask【{}】", periodTaskQueryVo.toString());
        return new ResponseEntity<>(periodTaskService.queryList(converter.toPeriodTaskDto(periodTaskQueryVo)), HttpStatus.OK);
    }

    /**
     * 批量更新tasks状态
     *
     * @param periodTaskVo
     * @return
     */
    @PostMapping("/batchUpdateTaskStatus")
    @ApiOperation("批量更新tasks状态")
    public ResponseEntity<?> batchUpdateTaskStatus(@RequestBody PeriodTaskVo periodTaskVo) {
        log.info("【PeriodTaskController.batchUpdateTaskStatus】: {}", periodTaskVo);
        int successCount = this.periodTaskService.batchUpdateTaskStatus(periodTaskVo);
        Map map = new HashMap(16);
        map.put("successCount", successCount);
        map.put("upCount", periodTaskVo.getPeriodTaskList().size());
        return new ResponseEntity<>(map, HttpStatus.OK);
    }

    /**
     * 删除task信息
     *
     * @param pkIds
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除task信息")
    public ResponseEntity<?> del(@RequestBody List<String> pkIds) {
        log.info("【PeriodTaskController.deltaskinfo】: {}", pkIds);
        this.periodTaskService.deltasksinfo(pkIds);
        return new ResponseEntity<>("删除成功！", HttpStatus.OK);
    }

    @PostMapping("/taskinfo/batchEditStatus")
    @ApiOperation("更新任务状态")
    public ResponseEntity<?> upTaskStatus(@RequestBody PeriodTaskVo periodTaskVo) {
        log.debug("【PeriodTaskController.upTaskStatus】periodTaskVo【{}】", periodTaskVo);
        this.periodTaskService.upTaskStatus(periodTaskVo);
        return new ResponseEntity<>("OK!", HttpStatus.OK);
    }

    @PostMapping("/qryTaskCodesByAppCode")
    @ApiOperation("根据应用编码查询任务编码集合")
    public ResponseEntity<?> qryTaskCodesByAppCode(@RequestBody PeriodTaskDto periodTaskDto) {
        log.debug("【PeriodTaskController.qryTaskCodesByAppCode】periodTaskDto={}", periodTaskDto.toString());
        return new ResponseEntity<>(this.periodTaskService.qryTaskCodesByAppCode(periodTaskDto), HttpStatus.OK);
    }

    @GetMapping("/qryTaskInfoByEchars")
    @ApiOperation("查询任务Echars图信息")
    public ResponseEntity<?> qryTaskInfoByEchars(@RequestParam String taskCode) {
        log.debug("【PeriodTaskController.qryTaskInfoByEchars】taskCode【{}】", taskCode);
        PeriodTaskDto periodTaskDto = new PeriodTaskDto();
        periodTaskDto.setTaskCode(taskCode);
        return new ResponseEntity<>(this.periodTaskService.qryTaskInfoByEchars(periodTaskDto), HttpStatus.OK);
    }

    /**
     * @Method: qryTaskInfoByTables
     * @Param: [periodTaskDto]
     * @Return: org.springframework.http.ResponseEntity<?>
     * @Description： 查询任务Echars图信息
     * @Author： jd.chen
     * @Date： 2021/7/8 15:07
     * @Version： V1.0
     */
    @PostMapping("/qryTaskInfoByTables")
    @ApiOperation("查询任务Echars图信息")
    public ResponseEntity<?> qryTaskInfoByTables(@RequestBody PeriodTaskDto periodTaskDto) {
        log.debug("【PeriodTaskController.qryTaskInfoByTables】taskCode【{}】", periodTaskDto.getTaskCode());
        return new ResponseEntity<>(this.periodTaskService.qryTaskInfoByTables(periodTaskDto), HttpStatus.OK);
    }

    /**
     * @Method: queryTaskBytaskCode
     * @Param: [taskCode]
     * @Return: org.springframework.http.ResponseEntity<?>
     * @Description： 查询任务Echars图信息
     * @Author： jd.chen
     * @Date： 2021/7/8 15:07
     * @Version： V1.0
     */
    @PostMapping("/queryTaskBytaskCode")
    @ApiOperation("查询任务Echars图信息")
    public ResponseEntity<?> queryTaskBytaskCode(@RequestBody String taskCode) {
        log.debug("【PeriodTaskController.qryTaskInfoByTables】taskCode【{}】", taskCode);
        PeriodTaskDto periodTaskDto = new PeriodTaskDto();
        periodTaskDto.setTaskCode(taskCode);
        return new ResponseEntity<>(this.periodTaskService.qryTaskInfoByTables(periodTaskDto), HttpStatus.OK);
    }

    /*
     * @Method: upDependChat <br>
     * @Param: [taskCode, bizDate] <br>
     * @Return: org.springframework.http.ResponseEntity<java.lang.Object> <br>
     * @Description：获取指定任务编码和业务日期的上游依赖图<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/26 10:12 <br>
     * @Version： V2.0.2<br>
     */
    @Log("周期任务实例上游依赖图")
    @ApiOperation("周期任务实例上游依赖图")
    @GetMapping("/upDependChat/{taskCode:.+}/{bizDate}/{showType}")
    public ResponseEntity<Object> upDependChat(@PathVariable("taskCode") String taskCode,
                                               @PathVariable("bizDate") String bizDate,
                                               @PathVariable("showType") String showType) {
        log.debug("【PeriodTaskController.upDependChat】上游依赖图: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.upDependChat(taskCode, bizDate, showType));
    }


    @Log("周期任务实例上游依赖图")
    @ApiOperation("周期任务实例上游依赖图")
    @GetMapping("/upDependChat/{taskCode:.+}/{bizDate}")
    public ResponseEntity<Object> upDepend(@PathVariable("taskCode") String taskCode,
                                               @PathVariable("bizDate") String bizDate) {
        log.debug("【PeriodTaskController.upDependChat】上游依赖图: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.upDepend(taskCode, bizDate));
    }


    @Log("周期任务实例单个查询")
    @ApiOperation("周期任务实例单个查询")
    @GetMapping("/task/{taskCode:.+}/{bizDate}")
    public ResponseEntity<Object> qryTask(@PathVariable("taskCode") String taskCode,
                                           @PathVariable("bizDate") String bizDate) {
        log.debug("【PeriodTaskController.upDependChat】周期任务实例单个查询: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.qryTask(taskCode, bizDate));
    }

    /*
     * @Method: upDependList <br>
     * @Param: [taskCode, bizDate] <br>
     * @Return: org.springframework.http.ResponseEntity<java.lang.Object> <br>
     * @Description：周期任务实例上游依赖列表<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/26 10:13 <br>
     * @Version： V2.0.2<br>
     */
    @Log("周期任务实例上游依赖列表")
    @ApiOperation("周期任务实例上游依赖列表")
    @GetMapping("/upDependList/{taskCode:.+}/{bizDate}")
    public ResponseEntity<Object> upDependList(@PathVariable("taskCode") String taskCode,
                                               @PathVariable("bizDate") String bizDate) {
        log.debug("【PeriodTaskController.upDependList】上游依赖列表: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.upDependList(taskCode, bizDate));
    }


    @Log("周期任务实例下游依赖图")
    @ApiOperation("周期任务实例下游依赖图")
    @GetMapping("/downDependChat/{taskCode:.+}/{bizDate}")
    public ResponseEntity<Object> downDepend(@PathVariable("taskCode") String taskCode,
                                                 @PathVariable("bizDate") String bizDate) {
        log.debug("【PeriodTaskController.downDependChat】下游依赖图: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.downDepend(taskCode, bizDate));
    }
    /*
     * @Method: downDependChat <br>
     * @Param: [taskCode, bizDate] <br>
     * @Return: org.springframework.http.ResponseEntity<java.lang.Object> <br>
     * @Description：周期任务实例下游依赖图<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/26 10:14 <br>
     * @Version： V2.0.2<br>
     */
    @Log("周期任务实例下游依赖图")
    @ApiOperation("周期任务实例下游依赖图")
    @GetMapping("/downDependChat/{taskCode:.+}/{bizDate}/{showType}")
    public ResponseEntity<Object> downDependChat(@PathVariable("taskCode") String taskCode,
                                                 @PathVariable("bizDate") String bizDate,
                                                 @PathVariable("showType") String showType) {
        log.debug("【PeriodTaskController.downDependChat】下游依赖图: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.downDependChat(taskCode, bizDate, showType));
    }

    /*
     * @Method: downDependList <br>
     * @Param: [taskCode, bizDate] <br>
     * @Return: org.springframework.http.ResponseEntity<java.lang.Object> <br>
     * @Description：周期任务实例下游依赖列表<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/26 10:14 <br>
     * @Version： V2.0.2<br>
     */
    @Log("周期任务实例下游依赖列表")
    @ApiOperation("周期任务实例下游依赖列表")
    @GetMapping("/downDependList/{taskCode:.+}/{bizDate}")
    public ResponseEntity<Object> downDependList(@PathVariable("taskCode") String taskCode,
                                                 @PathVariable("bizDate") String bizDate) {
        log.debug("【PeriodTaskController.downDependList】下游依赖列表: {}", taskCode);
        return ResponseEntity.ok(periodTaskService.downDependList(taskCode, bizDate));
    }

    /*
     * @Method: download <br>
     * @Param: [response, periodTaskQueryVo] <br>
     * @Return: org.springframework.http.ResponseEntity<java.lang.Object> <br>
     * @Description：导出周期任务实例<br>
     * @Author： wz.li<br>
     * @Date： 2023/5/4 16:47 <br>
     * @Version： V2.0.2<br>
     */
    @GetMapping("/download")
    @ApiOperation("导出周期任务实例")
    public ResponseEntity<Object> download(HttpServletResponse response, PeriodTaskQueryVo periodTaskQueryVo) {
        log.debug("【PeriodTaskController.download】参数【{}】", periodTaskQueryVo.toString());
        List<PeriodTask> periodTasks = periodTaskService.queryList(converter.toPeriodTaskDto(periodTaskQueryVo));
        this.periodTaskService.downloadTaskInfo(periodTasks, response);
        return new ResponseEntity<>("OK!", HttpStatus.OK);
    }
}

